package com.bank.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bank.entity.DepositType;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 存款类型数据访问层接口
 * 继承MyBatis Plus的BaseMapper，提供基础CRUD操作
 * 
 * @author 开发团队
 * @version 1.0.0
 * @since 2025-06-19
 */
@Mapper
public interface DepositTypeMapper extends BaseMapper<DepositType> {

    /**
     * 根据存款名称进行模糊查询
     * 
     * @param savingName 存款名称（支持模糊查询）
     * @return 存款类型列表
     */
    List<DepositType> selectBySavingNameLike(@Param("savingName") String savingName);

    /**
     * 根据存款名称进行精确查询
     * 
     * @param savingName 存款名称
     * @return 存款类型信息
     */
    DepositType selectBySavingName(@Param("savingName") String savingName);

    /**
     * 根据创建时间范围查询存款类型
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 存款类型列表
     */
    List<DepositType> selectByCreateTimeRange(@Param("startTime") LocalDateTime startTime, 
                                             @Param("endTime") LocalDateTime endTime);

    /**
     * 分页查询存款类型（支持多条件组合查询）
     * 
     * @param page 分页参数
     * @param savingName 存款名称（可选，支持模糊查询）
     * @param description 存款描述（可选，支持模糊查询）
     * @param startTime 创建开始时间（可选）
     * @param endTime 创建结束时间（可选）
     * @return 分页结果
     */
    IPage<DepositType> selectPageWithConditions(Page<DepositType> page,
                                               @Param("savingName") String savingName,
                                               @Param("description") String description,
                                               @Param("startTime") LocalDateTime startTime,
                                               @Param("endTime") LocalDateTime endTime);

    /**
     * 检查存款名称是否已存在（用于新增时验证）
     * 
     * @param savingName 存款名称
     * @param excludeSavingId 排除的存款ID（用于修改时验证）
     * @return 存在的记录数
     */
    int countBySavingName(@Param("savingName") String savingName, @Param("excludeSavingId") Integer excludeSavingId);

    /**
     * 获取存款类型统计信息
     * 
     * @return 存款类型总数
     */
    int selectTotalCount();

    /**
     * 根据存款类型ID查询是否有关联的银行卡
     * 
     * @param savingId 存款类型ID
     * @return 关联银行卡数量
     */
    int countCardsBySavingId(@Param("savingId") Integer savingId);

    /**
     * 获取所有可用的存款类型（用于下拉选择）
     * 
     * @return 存款类型列表
     */
    List<DepositType> selectAllAvailable();

    /**
     * 批量删除存款类型
     * 
     * @param savingIds 存款类型ID列表
     * @return 影响行数
     */
    int batchDeleteByIds(@Param("savingIds") List<Integer> savingIds);
}
